package vista;

import modelo.Asignacion;
import modelo.Empleado;
import modelo.Planificacion;

import org.joda.time.LocalDate;
import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.aop.windows.TransactionalDialog;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Link;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;

import com.uqbar.commons.collections.Transformer;

import database.Tienda;
import applicationModels.AsignadorDeEmpleados;
import applicationModels.ListadoPlanificaciones;
import applicationModels.PlanificadorDelDia;

public class CrearPlanificacionWindow extends
		TransactionalDialog<PlanificadorDelDia> {

	private static final long serialVersionUID = 1L;

	public CrearPlanificacionWindow(
			ListadoPlanificacionesWindow listadoPlanificacionesWindow,
			Planificacion planificacionSeleccionada) {
		super(listadoPlanificacionesWindow, new PlanificadorDelDia(
				planificacionSeleccionada));
	}

	public CrearPlanificacionWindow(
			ListadoPlanificacionesWindow listadoPlanificacionesWindow,
			LocalDate fechaCrear) {
		super(listadoPlanificacionesWindow, new PlanificadorDelDia(fechaCrear));
	}

	@Override
	protected void addActions(Panel actionsPanel) {
		new Button(actionsPanel).setCaption("Agregar Asignacion")
				.onClick(new MessageSend(this, "agregarAsignacion"))
				.setAsDefault().disableOnError();

		Link eliminar = new Button(actionsPanel)
				.setCaption("Eliminar Asignacion")
				.onClick(new MessageSend(this.getModelObject(),"eliminarAsignacion"))
				.setAsDefault()
				.disableOnError();

		NotNullObservable elementSelected = new NotNullObservable("asignacionSeleccionada");
		eliminar.bindEnabled(elementSelected);

		new Button(actionsPanel).setCaption("Listo")
				.onClick(new MessageSend(this, "accept")).setAsDefault()
				.disableOnError();

	}

	@Override
	public void accept() {
		this.getModelObject().guardarPlanificacion();
		super.accept();

		this.getModelObject().refrescarAsignaciones();
	}

	public void agregarAsignacion() {
		AgregarAsignacionWindow agregarAsignacionWindow = new AgregarAsignacionWindow(
				this, this.getModelObject().getPlanificacion());
		agregarAsignacionWindow.onAccept(new MessageSend(this.getModelObject(),
				"refrescarAsignaciones"));
		agregarAsignacionWindow.open();
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {

	}

	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle("Planificar horarios");
		this.setTaskDescription("Planificacion para el "
				+ this.getModelObject().getFecha());

		super.createMainTemplate(mainPanel);

		this.createResultsGrid(mainPanel);
	}

	protected void createResultsGrid(Panel mainPanel) {
		Table<Asignacion> table = new Table<Asignacion>(mainPanel,
				Asignacion.class);
		table.setHeigth(200);
		table.setWidth(730);

		table.bindItemsToProperty("asignaciones");
		table.bindValueToProperty("asignacionSeleccionada");

		this.describeResultsGrid(table);
	}

	private void describeResultsGrid(Table<Asignacion> table) {

		new Column<Asignacion>(table).setTitle("Nombre").setFixedSize(150)
				.bindContentsToProperty("empleadoAsignado.nombre");

		for (int i = 0; i < 24; i++) {
			this.crearColumna(new Integer(i), table);
		}

	}

	public void crearColumna(final Integer x, Table<Asignacion> table) {
		new Column<Asignacion>(table)
		.setTitle(x.toString())
		.setFixedSize(25)
		.bindContentsToTransformer(new Transformer<Asignacion, String>() {
			@Override
			public String transform(Asignacion a) {
				return a.ponerCruz(x);
			}
		});
	}

}
